package java_thinking.unit_16;

import java_thinking.net.mindview.util.CollectionData;
import java_thinking.net.mindview.util.CountingGenerator;
import java_thinking.unit_15._15_3.Generator;

import java.lang.reflect.Array;
import java.util.Arrays;

/**
 * @Desc:   Generator中创建数组
 * @author: cww
 * @DateTime: 2019/4/9 18:48
 */

public class _6_3_1Generated {
    /**
     * 使用任意的Generator来产生Object子类型的数组
     * @param a
     * @param gen
     * @param <T>
     * @return
     */
    public static <T> T[] array(T[] a , Generator<T> gen) {
        return new CollectionData<T>(gen,a.length).toArray(a);
    }

    /**
     * 第二个版本，接收一个Class对象，一个Generator所需的元素数量，然后来创建数组，并且使用所接收的Generator
     * 来填充它，
     * 注意这个工具只能产生Object子类型的数组，而不能产生基本类型数组
     * @param type
     * @param gen
     * @param size
     * @param <T>
     * @return
     */
    @SuppressWarnings("unchecked")
    public static <T> T[] array(Class<T> type,Generator<T> gen,int size) {
        T[] a = (T[]) Array.newInstance(type,size);
        return new CollectionData<T>(gen,size).toArray(a);
    }
}

class TestGenerated {
    public static void main(String[] args) {
        Integer[] a = {9,8,7,6};
        System.out.println(Arrays.toString(a));
        a = _6_3_1Generated.array(a,new CountingGenerator.Integer());
        System.out.println(Arrays.toString(a));
        Integer[] b = _6_3_1Generated.array(Integer.class,new CountingGenerator.Integer(),15);
        System.out.println(Arrays.toString(b));
        System.out.println("******************************");
        int[] b1 = _6_3_2ConvertTo.primitive(b);
        System.out.println(Arrays.toString(b1));
        boolean[] c = _6_3_2ConvertTo.primitive(_6_3_1Generated.array(Boolean.class,new CountingGenerator.Boolean(),15));
        System.out.println(Arrays.toString(c));

    }
}
